import { Component, Vue, Emit, Watch } from 'vue-property-decorator';
import { superFun, limiting } from '@/utils/Annotate'
import { set, get, cloneDeep } from 'lodash';
import { isNumber } from "lodash";
@Component({
})
export class mixinViewDialog extends Vue {
    // 弹窗是否显示
    isShow: boolean = false;

    // 主键，修改时使用
    infoData: any = -1;
    @Watch("infoData")
    updateinfoData(data: any) {
        const me = this as any;
        if (me.isShow && data != -1) {
            for (const name in data) {
                const value = data[name];
                if (isNumber(value)) {
                    data[name] = value.toString();
                }

            }
            // 视图绘制完执行，避免无法重置数据
            me.$nextTick(() => {
                me.init && me.init(data);
            })
        }
    }

    // 触发closeDialog事件
    @Emit('closeDialog') closeDialog() {
    }

    /**
     * 关闭弹窗
     * 使用时在dialog中配置@close="onDialogClose"
     * 取消按钮中配置@click="onDialogClose"
     * 点击取消按钮时，取消按钮@click="onDialogClose"先触发此方法,然后dialog的@close="onDialogClose"会二次触发此方法
     * 点击dialog的关闭按钮时,dialog的@close="onDialogClose"会触发此方法
     *
     * @memberof mixinViewDialog
     */
    @superFun()
    @limiting(500)
    onDialogClose() {
        console.log('onDialogClose')
        const me = this as any;
        // 检查是否有closeBefore方法，如果有就执行
        me.closeBefore && me.closeBefore();
        // 触发事件
        me.closeDialog(me.$vnode.data.ref);
    }

    // 设置弹窗是否隐藏
    // 此方法提供给父组件调用
    setHidden(v: boolean) {
        this.isShow = !v;
    }

    /**
     * 设值值
     *
     * @param {string} key 字段名称
     * @param {*} data 字段值
     * @memberof mixinViewDialog
     */
    setValue(key: string, data: any) {
        set(this, key, cloneDeep(data));
    }

    /**
    * 获取值
    *
    * @param {string} key 字段名称
    * @memberof mixinViewDialog
    */
    getValue(key: string) {
        return get(this, key);
    }
}
